package com.ykc.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;
/**
 * 代理管理器
 */
public class ProxyFactory {


    /**
     * 输入一个目标类和一组Proxy接口实现, 输出一个代理对象
     */
//    @SuppressWarnings("unchecked")
    //<T> T代表返回值T是泛型，T是一个占位符，在编译的时候确定
    public <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList) {
        //CGLIB enhancer增强类对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(targetClass);
        enhancer.setCallback(new MethodInterceptor() {
            /**
             * 代理方法, 每次调用目标方法时都会先创建一个 ProxyChain 对象, 然后调用该对象的 doProxyChain() 方法.
             */
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                ProxyChain proxyChain=new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams, proxyList);
//                methodProxy.invokeSuper(targetObject,methodParams);
                return proxyChain.doProxyChain();
            }
        });
        return  (T) enhancer.create();
    }
}
